// 验证登录用的token是否正常且能解析出用户数据
const JWT = require('jsonwebtoken');
const User = require('../model/user');

const config = 'QW';

module.exports = async (req, res, next) => {
    try {
        // 检查是否有authorization头
        let token = req.headers["authorization"];
        if (!token) {
            return res.json({ 
                code: 1,
                message: '缺少认证令牌，请先登录' 
            });
        }

        // 清理token格式
        token = token.replace("Bearer ", "").replace(/"/g, '');
        
        if (!token) {
            return res.json({ 
                code: 1,
                message: '认证令牌格式错误' 
            });
        }

        // 解析token
        const user = JWT.verify(token, config);

        // 根据解析好的token的信息查询用户
        const nowUser = await User.findById(user._id, { password: false });

        // 判断该用户是否有效
        if (nowUser && nowUser._id) {
            // 检查用户状态
            if (nowUser.status !== 'active') {
                return res.json({ 
                    code: 1,
                    message: '账户已被禁用，请联系管理员' 
                });
            }

            // 查询到了用户信息，将用户信息附加到请求对象
            req.userInfo = nowUser;
            next();
        } else {
            // token信息无效（用户不存在）
            res.json({ 
                code: 1,
                message: '用户不存在，请重新登录' 
            });
        }
    } catch (error) {
        console.error('JWT验证错误:', error.message);
        
        // 根据不同的错误类型返回不同的消息
        if (error.name === 'TokenExpiredError') {
            res.json({ 
                code: 1,
                message: '登录已过期，请重新登录' 
            });
        } else if (error.name === 'JsonWebTokenError') {
            res.json({ 
                code: 1,
                message: '认证令牌无效，请重新登录' 
            });
        } else if (error.name === 'NotBeforeError') {
            res.json({ 
                code: 1,
                message: '认证令牌尚未生效' 
            });
        } else {
            res.json({ 
                code: 1,
                message: '认证失败，请重新登录' 
            });
        }
    }
};